/**
 * 文件名：@AbstractViewNameResolver.java <br/>
 * 包名：cn.efunbox.afw.web.mvc.view <br/>
 * 项目名：afw-web <br/>
 * @author xtwin <br/>
 */
package cn.efunbox.afw.web.mvc.view;

import javax.servlet.http.HttpServletRequest;

import cn.efunbox.afw.core.holder.TargetHolder;

/**
 * 类名：AbstractViewNameResolver  <br />
 *
 * 功能：视图解析器
 *
 * @author xtwin <br />
 * 创建时间：2016年8月4日 下午11:21:44  <br />
 * @version 2016年8月4日
 */
public abstract class AbstractViewNameResolver implements ViewNameResolver {
	
	// 缓存视图名称时，使用的key
	private static final String KEY_VIEW_NAME = "__KEY_VIEW_NAME"; 
	
	// 视图名前缀
	protected String prefix = "";
	
	// 视图名后缀
	protected String suffix = "";

	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2016年8月4日 下午11:21:59<br/>
	 * 
	 * @param request
	 * @param response
	 * @param handler
	 * @return
	 * @throws Exception <br/>
	 * @see cn.efunbox.afw.web.mvc.view.ViewNameResolver#resolve(javax.servlet.http.HttpServletRequest)
	 */
	@Override
	public String resolve(HttpServletRequest request) throws Exception {
		// 检查缓存
		@SuppressWarnings("unchecked")
		TargetHolder<String> holder = (TargetHolder<String>) request.getAttribute(KEY_VIEW_NAME);
		
		if (null == holder) {
			// 解析视图名称
			String name = doResolve(request);

			if (null != name) {
				name = new StringBuilder().append(prefix).append(name).append(suffix).toString();
			}
			
			// 创建holder
			holder = new TargetHolder<String>(name);
			
			// 缓存holder
			request.setAttribute(KEY_VIEW_NAME, holder);
		}
		
		// 返回视图名称
		return holder.get();
	}
	
	/**
	 * 功能：执行解析 <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2016年8月4日 下午11:49:39 <br/>
	 */
	protected abstract String doResolve(HttpServletRequest request) throws Exception;

	/**
	 * @version 2016年8月5日-上午4:36:43
	 */
	public void setPrefix(String prefix) {
		this.prefix = prefix;
	}

	/**
	 * @version 2016年8月5日-上午4:36:43
	 */
	public void setSuffix(String suffix) {
		this.suffix = suffix;
	}
}